from transformers import AutoTokenizer, AutoModelForCausalLM,AutoConfig
import torch


"""
使用 llama.cpp 将 PyTorch 模型转换为 GGUF 
1. 安装 llama.cpp：首先，确保你已经安装了 llama.cpp。你可以从 llama.cpp 的 GitHub 仓库下载并编译它。
linux/macOS：
make
# 若支持 CUDA，可添加加速编译选项
make GGML_CUDA=1
windows:
mkdir build
cd build
cmake ..
cmake --build . --config Release
"""
#准备 PyTorch 模型
#确保 PyTorch 模型以标准格式保存（如包含 pytorch_model.bin 或 model.safetensors 的完整目录），通常通过 model.save_pretrained() 导出。
#这里就是用下面保存的模型


"""
如何保存为本地文件格式，以便后续的微调、使用、转换等
"""

#直接拉取huggingface上的模型然后保存后就进行转换
model_dir = "./model"
model_name = "Qwen/Qwen2.5-0.5B-Instruct"
save_dir = "./my_models/Qwen2.5-0.5-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_name, cache_dir=model_dir, torch_dtype="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)
 
tokenizer.save_pretrained(save_dir)
model.save_pretrained(save_dir)


"""
本地保存的模型是什么格式的？
使用 transformers 库中的 save_pretrained 方法将模型保存到本地后，模型会以特定的文件结构和格式存储，通常包含以下几种主要类型的文件：

1. 模型权重文件
pytorch_model.bin：如果使用的是 PyTorch 框架，模型的权重参数会被保存为 pytorch_model.bin 文件。这是一个二进制文件，包含了模型所有可训练参数的值。例如，在使用 AutoModelForCausalLM.from_pretrained 加载模型后，再使用 model.save_pretrained(save_dir) 保存模型，pytorch_model.bin 就会存储在指定的 save_dir 目录下。
tf_model.h5 或 tf_model.pb：若使用的是 TensorFlow 框架，模型权重可能会保存为 tf_model.h5（HDF5 格式）或 tf_model.pb（Protocol Buffers 格式）文件。不过在当前的 transformers 库中，PyTorch 更为常用。

2. 配置文件
config.json：该文件包含了模型的配置信息，如模型的架构、层数、隐藏层维度、注意力头数等。这些配置信息对于正确加载和使用模型至关重要。当使用 AutoModelForCausalLM.from_pretrained 加载模型时，会读取 config.json 文件来构建模型的结构。
tokenizer_config.json：保存分词器的配置信息，例如分词的方法、特殊标记的定义等。

3. 分词器文件
vocab.txt 或 spiece.model 等：根据分词器的类型不同，会有不同的文件保存分词器的词汇表。例如，对于基于字符或单词的简单分词器，可能会有 vocab.txt 文件，其中包含了所有的词汇；对于基于 SentencePiece 算法的分词器，会有 spiece.model 文件。

4. 其他可能的文件
special_tokens_map.json：记录特殊标记（如开始标记、结束标记、填充标记等）的映射关系。
综上所述，本地保存的模型是一个包含多个文件的目录结构，这些文件共同定义了模型的权重、配置和分词器等信息，确保模型可以被准确地重新加载和使用。
"""
# pth格式的模型文件如何保存为上述的格式
# 定义模型架构的配置
# 这里需要根据你的 .pth 模型的实际架构进行调整
config = AutoConfig.from_pretrained("gpt2")   # 例如，如果是 GPT 类模型，可以使用 "gpt2" 配置

# 创建一个空的模型实例
model = AutoModelForCausalLM.from_config(config)

# 加载 .pth 模型的权重
pth_model_path = "your_model.pth"
pth_weights = torch.load(pth_model_path)

# 将 .pth 模型的权重加载到新模型中
# 这里需要确保 .pth 模型的权重名称与新模型的权重名称匹配
# 可能需要进行一些名称映射的调整
model.load_state_dict(pth_weights)

# 保存模型为 transformers 格式
save_dir = "your_save_directory"
model.save_pretrained(save_dir)

#保存分词器（如果需要）
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# 保存分词器
tokenizer.save_pretrained(save_dir)

